/**
 * 在视频中添加文本水印
 *
 * ```shell
 * $ deno run --allow-run --allow-read --allow-write src/text-watermark.js -t "2022-08-21 @RJ" -i temp/input.mp4 -o temp/output-text-watermark.mp4
 * ```
 *
 * 命令行参数说明：
 * 1. -t : 水印文本，默认 "yyyy-MM-dd @RJ"
 * 2. -f : 字体文件，默认 "fonts/HarmonyOS_Sans_Regular.ttf"
 * 3. -c : 字体颜色，默认 "gray@0.5"
 * 4. -s : 字体大小，默认 "16"
 * 5. -p : 字体位置，默认视频右下脚(-p rb)，可以通过指定 "-p cm" 定位在视频中心位置，更多简便参数参看 EASY_POSITIONS
 * 6. -i : 输入视频，默认为 temp/input.mp4
 * 7. -o : 输出视频，默认为 temp/output-text-watermark.mp4，无 -o 键的参数也统一作为 -o 的值
 */

import { parse } from "/deno.land/std/flags/mod.ts";
import { createTextWatermark, ffmpeg } from "./share/ffmpeg.js";
import { log, ts } from "./share/common.js";

// 便捷的定位参数，如设置 "-p lt" 相当于设置文字水印在视频左上角
const EASY_POSITIONS = {
  LT: "x=2:y=2", // 左上角 left-top
  LM: "x=2:y=(h-th)/2", // 左中 left-middle
  LB: "x=2:y=(h-th-2)", // 左下角 left-bottom

  CT: "x=(w-tw)/2:y=2", // 中上 center-top
  CM: "x=(w-tw)/2:y=(h-th)/2", // 中心 center-middle
  CB: "x=(w-tw)/2:y=(h-th-2)", // 中下 center-bottom

  RT: "x=(w-tw-2):y=2", // 右上 right-top
  RM: "x=(w-tw-2):y=(h-th)/2", // 右中 right-middle
  RB: "x=(w-tw-2):y=(h-th-2)", // 右下 right-bottom
};

// 解析命令行参数
const parsedArgs = parse(Deno.args);

// 构建 ffmpeg 参数
const ffmpegArgs = { "-strict": "strict" };

// 1. 输入文件名，默认 "temp/input.mp4"
ffmpegArgs["-i"] = Object.hasOwn(parsedArgs, "i") ? parsedArgs["i"] : "temp/input.mp4";

// 2. 水印：默认在视频右下角 "yyyy-MM-dd @RJ"
const position = Object.hasOwn(parsedArgs, "p")
  ? EASY_POSITIONS[parsedArgs["p"].toUpperCase()] || parsedArgs["p"]
  : EASY_POSITIONS.RB;
const drawtext = createTextWatermark({
  text: Object.hasOwn(parsedArgs, "t") ? parsedArgs["t"] : `${ts("yyyy-MM-dd")} @RJ`,
  font: Object.hasOwn(parsedArgs, "f") ? parsedArgs["f"] : "fonts/HarmonyOS_Sans_SC_Regular.ttf",
  color: Object.hasOwn(parsedArgs, "c") ? parsedArgs["c"] : "blue@0.5",
  size: Object.hasOwn(parsedArgs, "s") ? parsedArgs["s"] : "16",
  position: position,
});
ffmpegArgs["-vf"] = drawtext;

// 3. 如果有 -y -n --vf 等自定义的参数也添加进去，方便自定义额外的 ffmpeg 参数
if (Object.hasOwn(parsedArgs, "y")) ffmpegArgs["-y"] = true;
if (Object.hasOwn(parsedArgs, "n")) ffmpegArgs["-n"] = true;
if (Object.hasOwn(parsedArgs, "vf")) {
  ffmpegArgs["-vf"] = Object.hasOwn(ffmpegArgs, "-vf") ? `${ffmpegArgs["-vf"]},${parsedArgs["vf"]}` : parsedArgs["vf"];
}

// 4. 输出文件名列表，默认 "temp/output-text-watermark.mp4"
ffmpegArgs["_"] = parsedArgs["_"];
if (Object.hasOwn(parsedArgs, "o")) ffmpegArgs["_"].push(parsedArgs["o"]);
if (ffmpegArgs["_"].length === 0) ffmpegArgs["_"].push(`temp/output-text-watermark.mp4`);

log(`开始生成带文本水印的视频`);

// 执行 ffmpeg 处理
await ffmpeg(ffmpegArgs, true);

log(`结束`);
